package catalogue

import (
	"errors"
	"time"

	"clouds.lgb24kcs.cn/controllers/catalogue/request"
	"clouds.lgb24kcs.cn/errorx"
	"clouds.lgb24kcs.cn/global"
	"clouds.lgb24kcs.cn/models"
	"clouds.lgb24kcs.cn/utils"
	"clouds.lgb24kcs.cn/utils/oss"
	"github.com/gin-gonic/gin"
)

type CatalogueListAPI struct {
}

var CatalogueList CatalogueListAPI

func (a *CatalogueListAPI) Cataloguelist(c *gin.Context, req request.CatalogueListReq, userId int64) {
	// 查询数据库对应catalogue数据
	/*
			首先选择bucket
		    通过bucketId查询当前bucket下面的所有目录对象
			因此oss秘钥都是一样的，不会出行两种不一样的秘钥
	*/
	catalogueInfo := []models.Catalogue{}
	api := oss.OSS{}

	tx := global.APP.DB.Where("userid=? and bucketid=?", userId, req.BucketId).Find(&catalogueInfo)
	if tx.Error != nil {
		global.APP.Log.Error(tx.Error.Error())
		utils.Fail(c, errorx.CatalogueList, tx.Error.Error())
	} else if tx.RowsAffected == 0 {
		global.APP.Log.Error(errors.New("目录对象加载失败").Error())
		utils.Fail(c, errorx.CatalogueList, errors.New("目录对象加载失败").Error())
	} else {
		// 查询oss存储对象秘钥，然后通过秘钥调用CatalogueObjectExists方法
		bucket := models.Storage{}

		d := global.APP.DB.Where("id=? and userid=?", req.BucketId, userId).First(&bucket)
		if d.Error != nil {
			global.APP.Log.Error(tx.Error.Error())
			utils.Fail(c, errorx.CatalogueList, tx.Error.Error())

		} else if d.RowsAffected == 0 {
			global.APP.Log.Error(errors.New("目录对象加载失败").Error())
			utils.Fail(c, errorx.CatalogueList, errors.New("目录对象加载失败").Error())

		} else {
			client := api.NewClient(bucket.Accesskey, bucket.Secretkey, bucket.Zone)
			//svc := oss.NewAws(bucket.Accesskey, bucket.Secretkey, bucket.Zone)
			// 循环处理查询出来的目录对象数据
			tmp := []request.CatalogueInfo{}
			for _, item := range catalogueInfo {
				if ok := api.CatalogueExists(client, item.Bucketname, item.Diskname); !ok {
					// 存在的话就存入临时变量tmp中
					tmp = append(tmp, request.CatalogueInfo{
						ID:            int64(item.ID),
						CatalogueName: item.Diskname,
						BucketName:    item.Bucketname,
						BucketId:      item.Bucketid,
						UserId:        item.Userid,
						CreateAt:      item.CreatedAt.Format(time.DateTime),
					})
				}

			}
			//if err := history.HistoryCreate(userId, c.Request.Method, c.Request.URL.String(), c.Request.Host); err != nil {
			//	utils.Fail(c, errorx.ObjectSearch, err.Error())
			//} else {
			//
			//
			//}
			utils.Success(c, 0, tmp)
		}
	}
}
